﻿/****************************************************************************
**该示例实现了Modbus服务器应用程序。---从站
**该示例充当Modbus服务器。它接收标准的Modbus请求，根据请求调整其内部状态，并以适当的回复进行响应
**此示例必须与Modbus客户端示例结合使用。在启动Modbus客户端示例之前，应启动此示例并将其置于监听状态。两个示例之间的后续交互使用Modbus协议。
**
**
** 执行任何通信都需要QModbusServer的实例。
** 根据指定的连接类型，该示例可以实例化QModbusRtuSerialServer（用于串行通信）或QModbusTcpServer（用于基于TCP的通信）
** QModbusServer：https://dengjin.blog.csdn.net/article/details/116938472
****************************************************************************/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QButtonGroup>
#include <QMainWindow>
#include <QModbusServer>

QT_BEGIN_NAMESPACE

class QLineEdit;

namespace Ui {
class MainWindow;
class SettingsDialog;
}

QT_END_NAMESPACE

class SettingsDialog;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private Q_SLOTS:
    void on_connectButton_clicked();
    void onStateChanged(int state);

    void coilChanged(int id);
    void discreteInputChanged(int id);
    void bitChanged(int id, QModbusDataUnit::RegisterType table, bool value);

    void setRegister(const QString &value);
    void updateWidgets(QModbusDataUnit::RegisterType table, int address, int size);

    void on_connectType_currentIndexChanged(int);

    void handleDeviceError(QModbusDevice::Error newError);

private:
    void initActions();
    void setupDeviceData();
    void setupWidgetContainers();

    Ui::MainWindow *ui;
    QModbusServer *modbusDevice;

    QButtonGroup coilButtons;
    QButtonGroup discreteButtons;
    QHash<QString, QLineEdit *> registers;
    SettingsDialog *m_settingsDialog;
};

#endif // MAINWINDOW_H
